package com.dsh.modbus;

import com.intelligt.modbus.jlibmodbus.Modbus;
import com.intelligt.modbus.jlibmodbus.master.ModbusMaster;
import com.intelligt.modbus.jlibmodbus.master.ModbusMasterFactory;
import com.intelligt.modbus.jlibmodbus.tcp.TcpParameters;

import java.net.InetAddress;
import java.util.Random;

public class app1 {
    //读线程的标识,在业务需要时可以控制程序的状态
    public static boolean FLAG = true;
    //读间隔时间
    public static final long READ_SPACE = 1000;
//    public static final String IP = "127.0.0.1";
    public static final String IP = "192.168.12.225";
    //从机地址
    public static final int SLAVE_ID = 1;
    public static Random R = new Random();

    public static void main(String[] args) {
        new Thread(new Runnable() {
            public void run() {
                try {
                    //设置主机TCP参数
                    TcpParameters tcpParameters = new TcpParameters();
                    //设置TCP的IP地址
                    InetAddress inetAddress = InetAddress.getByName(IP);
                    //TCP参数设置IP地址
                    tcpParameters.setHost(inetAddress);
                    //TCP设置长连接
                    tcpParameters.setKeepAlive(true);
                    //tcp设置端口,这里使用Modbus的默认端口502
                    tcpParameters.setPort(Modbus.TCP_PORT);
                    //创建一个主机
                    ModbusMaster modbusMaster = ModbusMasterFactory.createModbusMasterTCP(tcpParameters);
                    //Modbus.setLogLevel(Modbus.LogLevel.LEVEL_DEBUG);
                    //设置自增的id
                    Modbus.setAutoIncrementTransactionId(true);

                    if (!modbusMaster.isConnected()) {
                        //在博客中看到一位大佬点评,在创建master时,ModbusMasterTCP构造函数中已经进行了连接,理论上在这里不需要进行连接,
                        //如果在构造中连接失败,那么在这里连接应该也还会失败吧,那么在这里就应该停掉程序给用户提示连接失败信息,各位根据业务处理吧
                        /**
                         * public ModbusMasterTCP(TcpParameters parameters) {
                         *     super(ModbusConnectionFactory.getTcpMaster(parameters));
                         *     this.keepAlive = parameters.isKeepAlive();
                         *
                         *     try {
                         *         if (this.isKeepAlive()) {
                         *             this.connect();
                         *         }
                         *     } catch (ModbusIOException var3) {
                         *         Modbus.log().warning("keepAlive is set, connection failed at creation time.");
                         *     }
                         *
                         * }
                         */
                        System.out.println("Modbus主机没有连接,现在建立连接");
                        modbusMaster.connect();
                    } else {
                        System.out.println("Modbus主机已经连接");
                    }

                    while (FLAG) {
                        //寄存器读取开始地址
                        int offset = 0;
                        //读取寄存器数量
                        int quantity = 10;
                        //读取对应从机的数据
                        //注意这里使用的read函数,要根据寄存器的方法属性选用不同的读函数
                        //readHoldingRegisters
                        //readInputRegisters
                        //readCoils
                        //readDiscreteInputs
                        int[] registers = modbusMaster.readHoldingRegisters(SLAVE_ID, offset, quantity);
                        for (int register : registers) {
                            System.out.println("读取寄存器数据:" + offset++ + "-" + register);
                            //修改寄存器的值
                            modbusMaster.writeSingleRegister(SLAVE_ID, offset - 1, R.nextInt(1000) + 1);
                        }
                        System.out.println("--------------------------------------------");
                        Thread.sleep(READ_SPACE);
                    }
                } catch (Exception e) {
                    System.out.println("jlibmodbus运行异常:" + e.getClass().getName() + "-->" + e.getMessage());
                    e.printStackTrace();
                }
            }
        }).start();
    }



}